package main.leetcode.primary.from001to100;

import java.util.Arrays;

/**
 * 16.最接近的三数之和
 *
 * <p>给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数，使得它们的和与 target 最接近。返回这三个数的和。 假定每组输入只存在唯一答案。
 *
 * <p>例如，给定数组 nums = [-1，2，1，-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/3sum-closest
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class ex16 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 4, 8, 16, 32, 64, 128};
        System.out.println(threeSumClosest(nums, 82));
    }

    public static int threeSumClosest(int[] nums, int target) {
        int n = nums.length;
        Arrays.sort(nums);
        int r, l;
        int res = nums[0] + nums[1] + nums[2], sum;
        for (int i = 0; i < n - 2; i++) {
            l = i + 1;
            r = n - 1;
            while (l < r) {
                sum = nums[i] + nums[l] + nums[r];
                if (Math.abs(target - sum) < Math.abs(target - res)) res = sum;
                if (sum > target) r--;
                else if (sum < target) l++;
                else return sum;
            }
        }
        return res;
    }
}
